package cn.tqfeiyang.springplus.generator.jdbc;

import cn.tqfeiyang.springplus.generator.config.GeneratorConfig;
import cn.tqfeiyang.springplus.generator.name.NameConverter;
import cn.tqfeiyang.springplus.generator.name.NameFormat;
import cn.tqfeiyang.springplus.generator.type.DbColumnType;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import lombok.Getter;
import lombok.Setter;
import org.apache.ibatis.type.JdbcType;

import java.util.*;

/**
 * 字段信息
 */
@Setter
@Getter
public class FieldInfo {

    /**
     * 生成器配置
     */
    private GeneratorConfig generatorConfig;

    /**
     * 数据表信息
     */
    private TableInfo table;

    /**
     * 字段名称
     */
    private String name;

    /**
     * 原始注释
     */
    private String remarks;

    /**
     * 字段注释，去除了扩展属性
     */
    private String comment;

    /**
     * 数据库字段（关键字含转义符号）
     *
     * @since 3.3.2
     */
    private String columnName;

    /**
     * SQL数据类型
     */
    private String sqlType = null;

    /**
     * JDBC数据类型
     */
    private JdbcType jdbcType = JdbcType.CHAR;

    /**
     * 默认值
     */
    private String defaultValue = null;

    /**
     * 字段长度
     */
    private int length = 0;

    /**
     * 字段精度
     */
    private int scale = 0;

    /**
     * 是否可以为空？
     */
    private boolean nullable = false;

    /**
     * 是否是必须的？
     */
    private boolean required = false;

    /**
     * 是否唯一？
     */
    private boolean unique = false;

    /**
     * 验证器
     */
    private List<ValidatorInfo> validators = new ArrayList<>();

    /**
     * 是否有验证器？
     */
    public boolean getHasValidators() {
        return validators.size() > 0;
    }

    /**
     * 获取注解验证器
     *
     * @return 注解验证器
     */
    public List<ValidatorInfo> getAnnotationValidators() {
        return validators.stream()
                .filter(validator -> StringUtils.isNotBlank(validator.getAnnotationName()))
                .toList();
    }

    /**
     * 多对一关联
     */
    private JoinInfo.ManyToOneJoin manyToOneJoin;

    /**
     * 是否有多对一关联？
     */
    public boolean getHasManyToOneJoin() {
        return manyToOneJoin != null;
    }

    /**
     * 是否支持查询请求？
     */
    private boolean supportQueryRequest = false;

    /**
     * 是否支持添加请求？
     */
    private boolean supportCreateRequest = false;

    /**
     * 是否支持修改请求？
     */
    private boolean supportUpdateRequest = false;

    /**
     * 是否支持查询响应响应？
     */
    private boolean supportQueryResponse = true;

    /**
     * 是否支持查询详情响应？
     */
    private boolean supportDetailResponse = true;

    /**
     * 字段类型
     */
    private DbColumnType columnType;

    /**
     * 是否主键字段？
     */
    private boolean primaryKey = false;

    /**
     * 是否是自动递增字段？
     */
    private boolean autoIncrement = false;

    /**
     * 是否是乐观锁版本字段？
     */
    private boolean versionFlag = false;

    /**
     * 是否是逻辑删除字段？
     */
    private boolean logicDeleteFlag = false;

    /**
     * 是否是创建时间字段？
     */
    private boolean createTimeFlag = false;

    /**
     * 是否是创建人员字段？
     */
    private boolean createUserFlag = false;

    /**
     * 是否是修改时间字段？
     */
    private boolean updateTimeFlag = false;

    /**
     * 是否是修改人员字段？
     */
    private boolean updateUserFlag = false;

    /**
     * 字段填充
     */
    private String fillMode = "";

    /**
     * 获取命名助手
     */
    public Map<String, String> getNf() {
        Map<String, String> map = new HashMap<>();
        NameConverter nameConverter = generatorConfig.getNameConverter();
        Arrays.stream(NameFormat.values()).forEach(nameFormat -> {
            try {
                String value = nameConverter.convert(this, nameFormat);
                map.put(nameConverter.camelName(nameFormat.name()), value);
            } catch (RuntimeException e) {
                // 忽略错误
            }
        });
        return map;
    }

    /**
     * 从注释中获取扩展属性解析注释
     *
     * 注释格式：
     * 优先级
     * 优先级#enum=cn.cn.tqfeiyang.smartadmin.office.constant.PriorityEnum
     *
     * @param type
     * @return 注释
     */
    public String getExtra(String type) {
        if (StringUtils.isBlank(getRemarks())) {
            return null;
        }

        // 如果没有指定type，则返回字段说明，否则返回对应的参数值
        String[] items = org.apache.commons.lang3.StringUtils.split(getRemarks(), "#");
        if (StringUtils.isBlank(type)) {
            return items[0].trim();
        } else {
            for (String item : items) {
                String[] tokens = org.apache.commons.lang3.StringUtils.split(item, "=", 2);
                if (tokens.length == 2 && type.equalsIgnoreCase(tokens[0])) {
                    return tokens[1];
                }
            }
            return null;
        }
    }
}
